package 位运算;
import java.util.HashMap;
import java.util.Arrays;

/**
 * 这个题  简单的勾起了 一些 排序的 回忆
 * 
 * arginote 这个 大佬的 周赛 必看的 看他的 代码 进行学习
 * @author I adore you
 *
 */

public class leetcode1331排序运用题 {
	
	public static void main(String args[]) {
	int[]	arr = {37,12,28,9,100,56,80,5,12};
	System.out.println(Arrays.toString(solutionOne(arr)));
	System.out.println(Arrays.toString(solutionTwo(arr)));
	}
	/**
	 * 用 HashMap 来解决
	 * 其实这个 思路想到的  还是 挺简单的 
	 * 主要是长时间 没写 算法 对这些 容器 有一些 陌生
	 */
	public static int [] solutionOne(int arr []) {
		int len = arr.length;
		int ans [] = new int [len];
		// 用不到 再 创建一个 clone 数组 来使用 不需要
//		int clone [] = new int [len];
//		for(int i : arr)
		for(int i = 0 ;i < len ;i++)
			ans[i] = arr[i]; 
		
		// 巧妙的 地方在于 刚好 HashMap 的去重 效果 对于该题来说 有意向不到的 效果 
		HashMap<Integer,Integer> map = new HashMap<>();
		
		Arrays.sort(ans);	
		for(int i = 0,index = 1;i < len ;i++) {
			/**
			 * 这里 这个 index 索引下标的 使用 才是 这个 关键 （）
			 */
			if(!map.containsKey(ans[i]))
				map.put(ans[i], index++);
				
		}
		for(int i =  0;i < len ;i++) {
			ans[i] = map.get(arr[i]);
		}
		return ans;
	}
	/**
	 * 排序 
	 * 直接   对二维数组 进行排序
	 * 
	 * 这样写的 话 确实 下标 index 很绕 
	 * 可能一不留心 就 容易写错
	 */
	public static int [] solutionTwo(int arr[] ) {
		int len  = arr.length;
		int ans [] = new  int [len];
		int temp [][] = new int [len][2];
		for(int i = 0; i < len;i++) {
			temp[i] = new int [] {arr[i],i};
		}
//		Arrays.sort(temp,new Comparator<int []>() {
//
//			@Override
//			public int compare(int[] o1, int[] o2) {
//				return o1[0] - o2[0];
//			}
//			
//		});
		Arrays.sort(temp,(a,b) -> a[0] - b[0]);
		ans[temp[0][1]] = 1; 
		for(int i = 1,index = 1 ;i < len ;i++) {
//			if(temp[i][0] == temp[i - 1][0]) {
//				ans[temp[i][1]] = index;
//			}
//			else
//				ans[temp[i][1]] = ++index;
			ans[temp[i][1]] = temp[i][0] == temp[i - 1][0] ? index : ++index;
		}
		
		return ans;
	}

}
